package com.xxxtea.dto;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.xxxtea.common.execption.BusinessException;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.List;

/**
 * 地理位置数据传输对象
 *
 * 用于封装地理位置信息，包括：
 * - 经纬度坐标
 * - 坐标验证和转换
 * - 字符串格式处理
 *
 * 主要用于商家位置、任务位置等场景
 * 使用Lombok注解简化代码
 *
 * @author badman
 * @since 1.0.0
 */
@Data
@AllArgsConstructor
public class Location {
	/**
	 * 经度
	 * 地理坐标的经度值
	 */
	private double longitude;
	
	/**
	 * 纬度
	 * 地理坐标的纬度值
	 */
	private double latitude;

	/**
	 * 从字符串创建Location对象
	 * 
	 * @param location 格式为"经度,纬度"的字符串
	 * @return Location对象，如果输入为空则返回null
	 * @throws BusinessException 当经纬度格式不正确或超出有效范围时抛出异常
	 */
	public static Location of(String location) {
		if (StrUtil.isBlank(location)) {
			return null;
		}
		try {
			// 移除空格并按逗号分割
			List<String> parts = StrUtil.split(location.replace(" ", ""), StrUtil.COMMA);
			double longitude = Double.parseDouble(parts.get(0));
			double latitude = Double.parseDouble(parts.get(1));
			// 验证经纬度范围：经度-180到180，纬度-90到90
			Assert.isFalse(longitude < -180.0 || longitude > 180.0 || latitude < -90.0 || latitude > 90.0);
			return new Location(longitude, latitude);
		} catch (Exception e) {
			throw new BusinessException("经纬度不正确");
		}
	}

	/**
	 * 转换为字符串格式
	 * 
	 * @return 格式为"经度,纬度"的字符串
	 */
	@Override
	public String toString() {
		return longitude + "," + latitude;
	}
}
